/**
 * test Macro
 * @Author superlwb
 * @Date 2023-08-24
 * @Version 2.0
 * 提示：该脚本仅适用与需要移动的图片的大小均相等或相近（允许有误差，手动调整图片对齐有误差）
 */
function movePic()
{
	// 图片最大缩小宽度，觉得图片调小调整这里，300是3张图片效果最佳的时候
	const maxWidth = 300
	
	// 因为遇到图片大小差别大时，需要手动对齐图片大小，手动对齐存在误差，该误差通常在1左右，有需要，请手动更改
	const errorLength = 1
	
	// 获取每个ppt里面的图形（有形）对象，item(第几张)
	Application.ActivePresentation.Slides.Item(1).Shapes.Count
	
	// 获取整个ppt文件里面所有的ppt个数
	const pptCount = Application.ActivePresentation.Slides.Count
	
	
	for(let i=1;i<=pptCount;i++){
		

		let pptObj = Application.ActivePresentation.Slides.Item(i)
		mainFun(pptObj,maxWidth,errorLength)
		console.log("已处理了第 "+i+" 张ppt")
	}
	

}

function mainFun(pptObj,maxWidth,errorLength){
	// ppt宽高 
	const pptHeight = pptObj.Background.Height
	const pptWidth = pptObj.Background.Width
	
	// 该集合存储当前ppt的有效图片
	let preparePicList = Array(0)
	
	// 该对象用于存储待处理图片的长宽
	let autoSize = autoFindSize(pptObj,errorLength)
	

	preparePicList = findPrePicObj(pptObj,autoSize,errorLength)

//	console.log(preparePicList.length)
	
	// 处理图片
	if(preparePicList.length!=0){
		proccessPic(preparePicList,autoSize,pptWidth,pptHeight,maxWidth)		
	}
}

// 进行图片处理
function proccessPic(preList,size,pptWidth,pptHeight,maxWidth){
	const count = preList.length
//	console.log("数量："+count)
	
	// 间距
	const midLength = 10
		
	// 调整图片大小(缩小，放大倍数，1为原大小) 960
	const scale = autoGetScalc(size,maxWidth)
	const left = (pptWidth-((size.width*scale)*count+midLength*(count-1)))/2
	const top = (pptHeight-size.height*scale)/2
	for(let i=0;i<count;i++){
		
		let	pic =  preList[i]
		pic.Width = size.width*scale			
		pic.Height = size.height*scale
		
		// 设置ppt顶部到图片顶部距离
		pic.Top = top
		
		// 第一张特殊处理

		
		if(i==0){
			pic.Left=left
		}else{
			pic.Left = (size.width*scale+midLength)*i+left			
		}
		
	}
	
	
}

// 自动调整图片大小，按比例调整 maxWidth 最大宽度
function autoGetScalc(size,maxWidth){
	
	let	tempWidth = 0
	
	for(let i=1;i>=0;i-=0.01){
		
		tempWidth = size.width*i
		
		if(tempWidth<=maxWidth){
			return i
		}
	}
	
}


// 自动寻找大小一致，并在当前ppt幻灯片里面最多的大小
function autoFindSize(pptObj,errorLength){
	const count  = pptObj.Shapes.Count
	let sizeCount = 0
	let tempSizeList = []
					
	
	for(let i=1;i<=count;i++){
		
		// 当前对象
		let obj =  pptObj.Shapes.Item(i)
		
		// msoPicture 图片常量
		let type = obj.Type
		
		let flag = false
		
		// 先判断是否为图片 msoPicture
		if(type == msoPicture){
			
			for(let j=0;j<tempSizeList.length;j++){
				
				let item = tempSizeList[j]
				
				if(item==undefined){
					break
				}
				
				// 因为手动调整图片大小对齐有误差，所以需要手动调整误差，自动对齐
				
				// 高度误差,取绝对值
				const muchHeight =  Math.abs(item.height - obj.Height)
				const muchWidth=  Math.abs(item.width - obj.Width)

				
				if(muchHeight<=errorLength&&muchWidth<=errorLength){
					tempSizeList[j].count+=1
					flag=true
					break
				}
				
				
			}
				
			if(!flag){
				// 如果循环之后也没有，就添加
				tempSizeList.push({
					width:obj.Width,
					height:obj.Height,
					count:1
				})
			}
				
		}
		
	}

	
	// 筛选最多的
	let max = 0
	let index = 0
	
	for(let i= 0;i<tempSizeList.length;i++){
		
		const item = tempSizeList[i]
		
		if(item.count>max&&item.count>1){
			max=item.count
			index = i
		}
		
	}
	
//	console.log(" width:"+tempSizeList[index].width+" heigth:"+tempSizeList[index].height+" count:"+tempSizeList[index].count)

	if(max==0){
		return []
	}
	
	return tempSizeList[index]
	
}

// 寻找需要处理的图片
function findPrePicObj(pptObj,size,errorLength){
	let preList = []
	let allCount = pptObj.Shapes.Count
	
	for(let i=1;i<=allCount;i++){
		
		// 当前对象
		let obj =  pptObj.Shapes.Item(i)
		
		// msoPicture 图片常量
		let type = obj.Type
		
		// 先判断是否为图片 msoPicture
		if(type == msoPicture){
			
			// 高度误差,取绝对值
				const muchHeight =  Math.abs(size.height - obj.Height)
				const muchWidth=  Math.abs(size.width - obj.Width)
			
			if(muchHeight<=errorLength&&muchWidth<=errorLength){
				preList.push(obj)
			}
		}

	}
	
	return preList
}
